/** 
* @file        demo_zos_task.c
* @ingroup     task demo
* @brief       演示task 创建 删除
*/
/**
 * @defgroup task demo
 */
#include "zos_config.h"
#ifdef BOARD_USING_TASK_DEMO

#include "zos.h"
zos_task_t demo_task1_handle = ZOS_NULL;
zos_task_t demo_task2_handle = ZOS_NULL;

zos_sem_t demo_sem1 = ZOS_NULL;

//任务1执行函数
void demo_task1(void *parameter)
{
	zos_uint8_t num1=0;
	zos_printf("demo_task1 runing\r\n");
	//等待信号量，获得信号量以后才可以继续运行
	zos_sem_wait(demo_sem1,ZOS_WAITING_FOREVER);

	//循环打印数据
	for(num1=0;num1<30;num1++)
	{
		zos_printf("task1 num1=%d\r\n",num1);

		//延时1000 ms 也就是1秒
		zos_task_delay(1000);
	}

	//结束任务前需要先把任务句柄赋值为ZOS_NULL，然后调用zos_task_exit()函数结束任务本身
	demo_task1_handle = ZOS_NULL;
	zos_task_exit();
}
//任务2执行函数
void demo_task2(void *parameter)
{
	zos_uint8_t num=0;
	zos_printf("demo_task2 runing\r\n");
	while (1)
	{
		num++;
		if(num == 5)
		{
			//释放信号量，让任务1 继续运行
			zos_sem_post(demo_sem1);
		}
		else if(num == 10)
		{
			//挂起任务1
			zos_task_suspend(demo_task1_handle);
		}
		else if(num == 20)
		{
			//恢复任务1，让其继续运行
			zos_task_resume(demo_task1_handle);
		}
		else if(num == 50)
		{
			break;
		}

		zos_printf("task2    i=%d\r\n",num);

		//延时1000 ms 也就是1秒
		zos_task_delay(1000);
	}
	demo_task2_handle = ZOS_NULL;
	zos_task_exit();	
}

//任务初始化
int demo_task(int argc, char *argv[])
{
	//创建信号量
	demo_sem1 = zos_sem_create(0xffff,0);

	//创建用户任务，注意任务的Priority 优先级不能全部设置为同一个等级，自己后期创建的任务需要根据任务的情况适当的降低或者提高优先级。
	
	//创建任务1
	demo_task1_handle = zos_task_create("demo_task1",demo_task1,ZOS_NULL,1024,task_Priority_Normal1);

	//创建任务2
	demo_task2_handle = zos_task_create("demo_task2",demo_task2,ZOS_NULL,1024,task_Priority_Normal);

	return	ZOS_EOK;

}


#include "shell.h"

SHELL_EXPORT_CMD(demo_task,demo_task, task demo);

#endif










